// 输出是什么?
// counter.js

let counter = 10;

export default counter;

// index.js

import myCounter from "./counter";

myCounter += 1;

console.log(myCounter);

// A.
// 10

// B.
// 11

// C.
// Error

// D.
// NaN

// 正确答案：
// C
// 解析：
// 引入的模块是 只读 的: 你不能修改引入的模块。只有导出他们的模块才能修改其值。
// 当我们给myCounter增加一个值的时候会抛出一个异常： myCounter是只读的，不能被修改。




// 可存储多长时间？
sessionStorage.setItem('cool_secret', 123)

// A.
// 永远，数据不会丢失。

// B.
// 当用户关掉标签页时。

// C.
// 当用户关掉整个浏览器，而不只是关掉标签页。

// D.
// 当用户关闭电脑时。

// 正确答案：
// B
// 解析：
// 关闭 tab 标签页 后，sessionStorage 存储的数据才会删除。
// 如果使用 localStorage，那么数据将永远在那里，除非调用了 localStorage.clear()。




// 输出是什么?
let person = { name: "Lydia" };

const members = [person];

person = null;

console.log(members);

// A.
// null

// B.
// [null]

// C.
// [{}]

// D.
// [{ name: "Lydia" }]

// 正确答案：
// D
// 解析：
// 当设置两个对象彼此相等时，它们会通过 引用 进行交互。
// 但是当你将引用从一个变量分配至另一个变量时，其实只是执行了一个 复制 操作。（注意一点，他们的引用 并不相同!）
// 接下来我们让person等于null。

// 我们没有修改数组第一个元素的值，而只是修改了变量person的值,因为元素（复制而来）的引用与person不同。
// members的第一个元素仍然保持着对原始对象的引用。当我们输出members数组时，第一个元素会将引用的对象打印出来。




// 当我们这么做时，会发生什么？
function bark() {

console.log('Woof!')

}

bark.animal = 'dog'

// A.
// 正常运行!

// B.
// SyntaxError. 你不能通过这种方式给函数增加属性。

// C.
// undefined

// D.
// ReferenceError

// 正确答案：
// A
// 解析：
// 这在 JavaScript 中是可以的，因为函数是对象！（除了基本类型之外其他都是对象）
// 函数是一个特殊的对象。你写的这个代码其实不是一个实际的函数。函数是一个拥有属性的对象，并且属性也可被调用。




// 返回值是什么?
const firstPromise = new Promise((res, rej) => {

setTimeout(res, 500, "one");

});

const secondPromise = new Promise((res, rej) => {

setTimeout(res, 100, "two");

});

Promise.race([firstPromise, secondPromise]).then(res => console.log(res));

//备注：setTimeout第三个参数以及以后的参数是：附加参数，一旦定时器到期，
// 它们会作为参数传递给function 或执行字符串（setTimeout参数中的code）。即是回调函数的参数。

// A.
// "one"

// B.
// "two"

// C.
// "two" "one"

// D.
// "one" "two"

// 正确答案：
// B
// 解析：
// 当我们向Promise.race方法中传入多个Promise时，会进行 优先 解析。
// 在这个例子中，我们用setTimeout给firstPromise和secondPromise分别设定了500ms和100ms的定时器。
// 这意味着secondPromise会首先解析出字符串two。那么此时res参数即为two，是为输出结果。
